package com.bjc.service.impl;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * @program: spring-cloud-alibaba
 * @description:
 * @author: bjc
 * @create: 2021-08-01 20:46
 */
@Service
@Slf4j
public class OrderServiceImpl3 {

    /**
     * 定义资源 value指定资源名称
     * 定义当资源内部发生异常的时候的处理逻辑
     * blockHandler  定义当资源内部发生了blockException应该进入的方法（捕获的时Sentinel定义的异常）
     * fallback      定义当资源内部发生了Throwable应该进入的方法
     */
    @SentinelResource(value = "message",
            blockHandler = "blockHandler",
            blockHandlerClass = OrderServiceImpl3BlockHandlerClass.class,
            fallback = "fallback",
            fallbackClass = OrderServiceImpl3FallbackClass.class
    )
    public String message(){
        return "message";
    }

    /**
     * blockHandler
     * 要求：
     * 1.当前方法的返回值和参数要跟原方法一致
     * 2.但是允许在参数列表的最后加入一个参数BlockException，用来接收原方法中的异常
     */
//    public String blockHandler(BlockException e){
//        //自定义异常处理逻辑
//        log.error("触发了BlockException，内容为{}",e);
//        return "BlockException";
//    }

    /**
     * fallback
     * Throwable时进入的方法
     */
//    public String fallback(Throwable throwable) {
//        log.error("触发了Throwable,内容为{}", throwable);
//        return "Throwable";
//    }
}
